home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / pas_0593.zip / DISPIC.PAS < prev    next >
Pascal/Delphi Source File  |  1993-05-30  |  5KB  |  147 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 168 of 187                                                               
  3. From : BRIAN PAPE                          1:2250/26.0          21 May 93  10:04 
  4. To   : SEAN PALMER                                                               
  5. Subj : DISPLAYING A GRAPHIC                                                   
  6. ────────────────────────────────────────────────────────────────────────────────
  7. SP>If I remember right, a PIC file is just an uncompressed array of pixels.
  8. SP>A 256-color PIC file is probably the easiest picture file format of all.
  9. SP>It is set up just like an array[0..height-1,0..width-1]of byte.
  10. SP>They usually keep the palette file separately (as a PAL file) that is an
  11. SP>array[0..255]of record r,g,b:byte; end;
  12.  
  13. Here's how to read and display a .PIC file...  (Gee, I'm posting a lot
  14. of code today, must be in a good mood ;)    That means, somebody else
  15. get posting too...  Heheh- anyway, this will *QUICKLY* read and display
  16. a normal .PIC file, with the palette header info at the beginning.  It
  17. doesn't even try to figure it out- it assumes 320x200x256 colors- I
  18. didn't feel like decoding anything to try to differentiate between
  19. different fmts...  It does try to tell you what the dimensions and stuff
  20. are, just doesn't use them }
  21.  
  22. { This program is (c) copyright 1992-1993 Brian Pape for Alphawave
  23.   Technologies and Jaeger Technologies.  But, since I grab so much good
  24.   code off of the pascal echo, I suppose that anyone who reads this
  25.   message on the pascal echo, or gets it from someone who reads the
  26.   pascal echo, or....  can freely use it and all parts contained within
  27.   (or however a lawyer would say that it's *PD* :)    This constitutes
  28.   over 31 minutes of hard work, btw... }
  29.  
  30. program dispic;
  31. const
  32.   maxpicsize = 320*200;
  33. type
  34.   pbuf = ^abuf;
  35.   abuf=array[1..maxPICSIZE] of byte;
  36.   palbuf = ^apalbuf;
  37.   apalbuf=array[1..256*3] of byte;
  38.   headerbuf=^aheaderbuf;
  39.   aheaderbuf=array[1..32] of byte;
  40. var
  41.   f : file;
  42.   i : byte;
  43.   buf : pbuf;
  44.   pal : palbuf;
  45.   header : headerbuf;
  46.   hsize,vsize,picsize,headersize,palettesize:word;
  47.   _r,_g,_b,
  48.   cr : byte;
  49.   nr,ctr : word;
  50.   fs,overflow : longint;
  51.   filename : string;
  52.  
  53.  
  54. procedure setcolreg(p:pointer;start,num:word);
  55. begin
  56.   asm
  57.     mov  ah,10h
  58.     mov  al,12h           { seg block of color registers }
  59.     mov  bx,start
  60.     mov  cx,num
  61.     mov  dx,word ptr p+2  { get high word of p (seg) }
  62.     mov  es,dx
  63.     mov  dx,word ptr p    { get low word of p (ofs) }
  64.     int  $10
  65.   end;
  66. end;
  67.  
  68. procedure stop(s:string);
  69. begin
  70.   writeln(s);
  71.   halt;
  72. end;
  73.  
  74. begin
  75.   writeln('DISPIC v0.01ß (c)1993 Brian Pape/Jagaer Technologies'+#10#13);
  76.   writeln(maxavail,' bytes available.');
  77.   if paramcount < 1 then
  78.     stop('no .PIC file specified.');
  79.   filename := paramstr(1);
  80.   assign(f,filename);
  81.   {$I-} reset(f,1); {$I+}
  82.   if ioresult <> 0 then
  83.     begin
  84.       writeln('file '+filename+' not found.');
  85.       halt;
  86.     end;
  87.   new(header);
  88.   writeln(maxavail,' bytes available after header allocate.');
  89.   palettesize := sizeof(pal^);
  90.   headersize := sizeof(header^);
  91.  
  92.   if filesize(f) < headersize+palettesize then stop('invalid .pic file.');
  93.  
  94.   blockread(f,header^,headersize,nr);
  95.   if nr < sizeof(headersize) then
  96.     stop('insufficient header information.')
  97.   else
  98.     writeln('header: ',nr,' bytes read.');
  99.   hsize := (word(header^[4]) shl 8) or header^[3];
  100.   vsize := (word(header^[6]) shl 8) or header^[5];
  101.  
  102.   picsize := (word(header^[14]) shl 8) or header^[13];
  103.   writeln('picsize: ',picsize,' bytes.');
  104.   if picsize > maxpicsize then
  105.     begin
  106.       picsize := maxpicsize;
  107.       writeln('picture size read overflow. resetting to maxpicsize.');
  108.     end;
  109.  
  110.   dispose(header);
  111.   new(pal);
  112.   writeln(maxavail,' bytes available after palette allocate.');
  113.  
  114.   blockread(f,pal^,palettesize,nr);
  115.   if nr < palettesize then
  116.     stop('insufficient palette information.')
  117.   else
  118.     writeln('palette: ',nr,' bytes read.');
  119.  
  120.   new(buf);
  121.   writeln(maxavail,' bytes available after buffer allocate.');
  122.   {$I-} blockread(f,buf^,sizeof(buf^),nr); {$I+}
  123.   if ioresult <> 0 then;
  124.   writeln('picture: ',nr,' bytes read.');
  125.   writeln('hsize: ',hsize);
  126.   writeln('vsize: ',vsize);
  127.   writeln('press enter.');
  128.   readln;
  129.   close(f);
  130.   asm
  131.     mov ah,00
  132.     mov al,$13
  133.     int $10
  134.   end;
  135.   move(buf^,ptr($a000,0)^,nr);
  136.  
  137.   setcolreg(pal,0,256);
  138.  
  139.   dispose(buf);
  140.   dispose(pal);
  141.   readln;
  142.   asm
  143.     mov ah,00
  144.     mov al,03
  145.     int $10
  146.   end;
  147. end.